﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebAppPlanProduccion.Code;
using Web.Framework;

using PlanProd.Contracts.enums;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code.Contracts;
using WebAppPlanProduccion.Code.Security;
using Web.Framework.Svc;

namespace WebAppPlanProduccion.App
{
    public partial class DesvioList : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                EsPaginaQueRecurdaFiltros = true;
                HasPermissionToSeeMe(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER);

                if (!IsPostBack)
                {
                    UIHelper.LoadTipoDesvio(cboTipoDesvio, "Todos");
                    UIHelper.LoadEstadoCharAprobado(cboEstado, "Todos");
                    UIHelper.LoadCausaDeDesvio(cboDesvioCausa, "Todas");
                    UIHelper.LoadDestinos(cboDestino, "Todos");
                    UIHelper.LoadTemporadas(cboTemporada);
                    UIHelper.LoadProveedores(cboProveedor, "Todos");

                    if (this.Request.QueryString["PlanProdId"] != null)
                    {
                        this.txtPlanProduccionId.Text = this.Request.QueryString["PlanProdId"];
                        this.cboEstado.SelectedValue = Convert.ToString((int)EstadoCharAprobado.EsperandoAprobacion);
                        Buscar();
                    }
                }
            } 
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void Buscar()
        {
            RecordarFiltrosSeleccionados();
            ServiceOptions searchOptions = new ServiceOptions();
            searchOptions.PageNumber = GridDesvios.PageIndex;
            searchOptions.PageSize = GridDesvios.PageSize;

            int? id;
            int? planProduccionId;
            TipoDesvio? tipoDesvio;
            EstadoCharAprobado? estadoAprobado;
            int? causaDesvio;
            int? destinoId;
            int? temporadaId;
            int? proveedorId;
            string producto;
            string color;
            DateTime? fechaDesde;
            DateTime? fechaHasta;
            DateTime? fechaDesvioDesde;
            DateTime? fechaDesvioHasta;

            id = UIHelper.GetIntFromInputText(txtDesvioId.Text);
            planProduccionId = UIHelper.GetIntFromInputText(txtPlanProduccionId.Text);
            tipoDesvio = (TipoDesvio?)UIHelper.GetIntFromInputCbo(cboTipoDesvio);
            estadoAprobado = (EstadoCharAprobado?)UIHelper.GetIntFromInputCbo(cboEstado);
            causaDesvio = UIHelper.GetIntFromInputCbo(cboDesvioCausa);
            destinoId = UIHelper.GetIntFromInputCbo(cboDestino);
            temporadaId = UIHelper.GetIntFromInputCbo(cboTemporada);
            proveedorId = UIHelper.GetIntFromInputCbo(cboProveedor);
            producto = this.txtProducto.Text;
            color = this.txtColor.Text;
            fechaDesde = UIHelper.GetDateTimeFromInputText(txtFechaDesde.Text);
            fechaHasta = UIHelper.GetDateTimeFromInputText(txtFechaHasta.Text);
            fechaDesvioDesde = UIHelper.GetDateTimeFromInputText(txtFechaDesvioDesde.Text);
            fechaDesvioHasta = UIHelper.GetDateTimeFromInputText(txtFechaDesvioHasta.Text);

            List<Desvio> desvios = WebServiceHelper.GetDesvios(searchOptions, id, planProduccionId, producto, color, tipoDesvio, estadoAprobado, causaDesvio, destinoId, temporadaId, proveedorId, fechaDesde, fechaHasta, fechaDesvioDesde, fechaDesvioHasta);
            List<WebDesvio> webDesvios = new List<WebDesvio>(desvios.Count);

            foreach (Desvio desvio in desvios)
            {
                WebDesvio webDesvio = new WebDesvio();

                webDesvio.Id = desvio.Id;
                webDesvio.IntTipoDesvio = desvio.IntTipoDesvio;
                webDesvio.CausaDesvioNombre = desvio.CausaDesvioNombre;
                webDesvio.EstadoAprobacion = (EstadoCharAprobado)desvio.Estado[0];
                webDesvio.EstadoDescripcion =  ((EstadoCharAprobado)desvio.Estado[0]).GetDescription();
                webDesvio.ProductoSapArticuloNombre = desvio.ProductoSapArticuloNombre;
                webDesvio.ProductoSapColorNombre = desvio.ProductoSapColorNombre;
                webDesvio.FechaCreacion = desvio.FechaCreacion;
                webDesvio.PlanProduccionId = desvio.PlanProduccionId;
                webDesvio.ProductoIdExterno = desvio.ProductoIdExterno;
                webDesvio.FechaDesvio = desvio.FechaDeDesvio;

                string cambioCantidad = string.Empty;
                string sep = string.Empty;
                foreach (DesvioDetalle detalleDesvio in desvio.DesvioDetalles)
                {
                    cambioCantidad += sep;
                    cambioCantidad += detalleDesvio.NumeroSemana.ToString() + ": " + detalleDesvio.CantidadInicial + "->" + detalleDesvio.CantidadFinal;
                    sep = ", ";
                }

                webDesvio.DesvioCambiosCantidades = cambioCantidad;

                webDesvios.Add(webDesvio);
            }

            this.GridDesvios.DataSource = webDesvios;
            this.GridDesvios.DataBind();
        }

        protected void GridDesvios_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                this.GridDesvios.PageIndex = e.NewPageIndex;

                Buscar();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected override void ApplySecurity()
        {
            if (this.GridDesvios.DataSource != null)
            {
                this.GridDesvios.Columns[0].Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER);
                this.GridDesvios.Columns[1].Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_ELIMINAR);
                this.GridDesvios.Columns[2].Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER_ORIGEN);               
            }
        }

        protected void GridDesvios_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "editar")
                {
                    int desvioId = Convert.ToInt32(this.GridDesvios.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    this.Response.Redirect(string.Format("/App/DesvioIndividual.aspx?Id={0}", desvioId), true);
                }
                else if (e.CommandName == "eliminar")
                {
                    int desvioId = Convert.ToInt32(this.GridDesvios.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    WebServiceHelper.EliminarDesvio(desvioId);
                    Buscar();
                }
                else if (e.CommandName == "aprobar")
                {
                    int desvioId = Convert.ToInt32(this.GridDesvios.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    WebServiceHelper.AprobarDesvio(desvioId, BaseWebPage.UserName, EstadoCharAprobado.Aprobado);
                }
                else if (e.CommandName == "ver")
                {
                    int desvioId = Convert.ToInt32(this.GridDesvios.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    this.Response.Redirect(string.Format("/App/DesvioOrigenSap.aspx?Id={0}", desvioId), true);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridDesvios_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {        
                e.Row.Cells[0].Attributes.Add("title", "Editar");
                e.Row.Cells[1].Attributes.Add("title", "Eliminar");
                e.Row.Cells[2].Attributes.Add("title", "Ver");

                WebDesvio desvio = (WebDesvio)e.Row.DataItem;
                bool estadoAprobado = desvio.EstadoAprobacion == EstadoCharAprobado.Aprobado || desvio.EstadoAprobacion == EstadoCharAprobado.Rechazado || desvio.EstadoAprobacion == EstadoCharAprobado.EsperandoAprobacion;
                ImageButton btnEliminarCtrl = (ImageButton)e.Row.FindControl("btnEliminar");
                if (estadoAprobado)
                {
                    btnEliminarCtrl.Visible = false;
                }
                else
                {
                    btnEliminarCtrl.OnClientClick = "return confirm('Está seguro que desea eliminar el siguiente registro?')";
                }
            }
        }

        protected void lnkBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                Buscar();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}